home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Toolbox / Visual Basic Toolbox (P.I.E.)(1996).ISO / graphics / itgraph / delphi / playgrnd.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-09-05  |  36.6 KB  |  1,186 lines

  1. unit Playgrnd;
  2.  
  3. interface
  4.  
  5. uses
  6.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  7.   Forms, Dialogs, VBXCtrl, ITGDefs, Menus, Itgraph, NodeInfo, ConnInfo,
  8.   Printers;
  9.  
  10. type
  11.   TPlayground = class(TForm)
  12.     ITGraph1: TITGraph;
  13.     MainMenu1: TMainMenu;
  14.     File1: TMenuItem;
  15.     Exit1: TMenuItem;
  16.     N1: TMenuItem;
  17.     PrintSetup1: TMenuItem;
  18.     Print1: TMenuItem;
  19.     N2: TMenuItem;
  20.     SaveAs1: TMenuItem;
  21.     Save1: TMenuItem;
  22.     Open1: TMenuItem;
  23.     New1: TMenuItem;
  24.     OpenDialog1: TOpenDialog;
  25.     SaveDialog1: TSaveDialog;
  26.     Node1: TMenuItem;
  27.     New2: TMenuItem;
  28.     Remove1: TMenuItem;
  29.     Options1: TMenuItem;
  30.     AutoArrange1: TMenuItem;
  31.     Automatic1: TMenuItem;
  32.     Manual1: TMenuItem;
  33.     Now1: TMenuItem;
  34.     ArrangeMode1: TMenuItem;
  35.     DrawDir1: TMenuItem;
  36.     Hierarchy1: TMenuItem;
  37.     Compact1: TMenuItem;
  38.     FlowChart1: TMenuItem;
  39.     Tree1: TMenuItem;
  40.     RightToLeft1: TMenuItem;
  41.     LeftToRight1: TMenuItem;
  42.     BottomToTop1: TMenuItem;
  43.     TopToBottom1: TMenuItem;
  44.     PopupMenu1: TPopupMenu;
  45.     ColorDialog1: TColorDialog;
  46.     FillColor1: TMenuItem;
  47.     TextColor1: TMenuItem;
  48.     BorderColor1: TMenuItem;
  49.     N3: TMenuItem;
  50.     BackColor1: TMenuItem;
  51.     DefFillColor1: TMenuItem;
  52.     ForeColor1: TMenuItem;
  53.     N4: TMenuItem;
  54.     Font1: TMenuItem;
  55.     FontDialog1: TFontDialog;
  56.     PopupMenu2: TPopupMenu;
  57.     MenuItem5: TMenuItem;
  58.     MenuItem6: TMenuItem;
  59.     MenuItem7: TMenuItem;
  60.     MenuItem8: TMenuItem;
  61.     MenuItem9: TMenuItem;
  62.     PrinterSetupDialog1: TPrinterSetupDialog;
  63.     ItemShape1: TMenuItem;
  64.     ItemGraphic1: TMenuItem;
  65.     DrawArrows1: TMenuItem;
  66.     DrawBackLinks1: TMenuItem;
  67.     DrawColored1: TMenuItem;
  68.     DrawConnLabels1: TMenuItem;
  69.     DrawHandles1: TMenuItem;
  70.     DrawItemLabels1: TMenuItem;
  71.     N5: TMenuItem;
  72.     RubberBand1: TMenuItem;
  73.     None1: TMenuItem;
  74.     Items1: TMenuItem;
  75.     Handles1: TMenuItem;
  76.     Both1: TMenuItem;
  77.     Special1: TMenuItem;
  78.     GenerateTree1: TMenuItem;
  79.     N8Nodes1: TMenuItem;
  80.     N15Nodes1: TMenuItem;
  81.     N25Nodes1: TMenuItem;
  82.     N50Nodes1: TMenuItem;
  83.     RandomDirectedGraph1: TMenuItem;
  84.     N8Nodes2: TMenuItem;
  85.     N15Nodes2: TMenuItem;
  86.     N25Nodes2: TMenuItem;
  87.     N50Nodes2: TMenuItem;
  88.     N6: TMenuItem;
  89.     RandomSizedNodes1: TMenuItem;
  90.     Duplicate1: TMenuItem;
  91.     PrintDialog1: TPrintDialog;
  92.     GraphicStyle1: TMenuItem;
  93.     NoGraphic1: TMenuItem;
  94.     FullGraphic1: TMenuItem;
  95.     HalfGraphic1: TMenuItem;
  96.     IconGraphic1: TMenuItem;
  97.     FindDialog1: TFindDialog;
  98.     N7: TMenuItem;
  99.     FindNode1: TMenuItem;
  100.     FindAgain1: TMenuItem;
  101.     PrintReport1: TMenuItem;
  102.     DrawScale1: TMenuItem;
  103.     FitToScreen1: TMenuItem;
  104.     N251: TMenuItem;
  105.     N501: TMenuItem;
  106.     N751: TMenuItem;
  107.     N1001: TMenuItem;
  108.     N2001: TMenuItem;
  109.     N4001: TMenuItem;
  110.     BringToFront1: TMenuItem;
  111.     SendToBack1: TMenuItem;
  112.     N8: TMenuItem;
  113.     ShiftLeft1: TMenuItem;
  114.     ShiftRight1: TMenuItem;
  115.     procedure New1Click(Sender: TObject);
  116.     procedure Exit1Click(Sender: TObject);
  117.     procedure Open1Click(Sender: TObject);
  118.     procedure SaveAs1Click(Sender: TObject);
  119.     procedure Save1Click(Sender: TObject);
  120.     procedure FormResize(Sender: TObject);
  121.     procedure New2Click(Sender: TObject);
  122.     procedure AutoArrange1Click(Sender: TObject);
  123.     procedure ManualArrange1Click(Sender: TObject);
  124.     procedure ArrangeNow1Click(Sender: TObject);
  125.     procedure Automatic1Click(Sender: TObject);
  126.     procedure Manual1Click(Sender: TObject);
  127.     procedure Now1Click(Sender: TObject);
  128.     procedure Hierarchy1Click(Sender: TObject);
  129.     procedure Compact1Click(Sender: TObject);
  130.     procedure FlowChart1Click(Sender: TObject);
  131.     procedure Tree1Click(Sender: TObject);
  132.     procedure RightToLeft1Click(Sender: TObject);
  133.     procedure LeftToRight1Click(Sender: TObject);
  134.     procedure BottomToTop1Click(Sender: TObject);
  135.     procedure TopToBottom1Click(Sender: TObject);
  136.     procedure ITGraph1Click(Sender: TObject; var Button, Shift, X,
  137.       Y: Integer);
  138.     procedure ITGraph1ItemClick(Sender: TObject; var ItemIx, ItemHandle,
  139.       Button, Shift, X, Y: Integer);
  140.     procedure ITGraph1KeyPress(Sender: TObject; var Key: Char);
  141.     procedure Remove1Click(Sender: TObject);
  142.     procedure ITGraph1ItemConnect(Sender: TObject; var FromIx, FromHandle,
  143.       ToIx, ToHandle, Button, Shift: Integer);
  144.     procedure Print1Click(Sender: TObject);
  145.     procedure FillColor1Click(Sender: TObject);
  146.     procedure TextColor1Click(Sender: TObject);
  147.     procedure BorderColor1Click(Sender: TObject);
  148.     procedure ForeColor1Click(Sender: TObject);
  149.     procedure BackColor1Click(Sender: TObject);
  150.     procedure DefFillColor1Click(Sender: TObject);
  151.     procedure Font1Click(Sender: TObject);
  152.     procedure ITGraph1SelectRect(Sender: TObject; var L, T, W, H, Button,
  153.       Shift: Integer);
  154.     procedure ITGraph1DblClick(Sender: TObject; var Button, Shift, X,
  155.       Y: Integer);
  156.     procedure PrintSetup1Click(Sender: TObject);
  157.     procedure ItemShape1Click(Sender: TObject);
  158.     procedure ItemGraphic1Click(Sender: TObject);
  159.     procedure ITGraph1ItemDblClick(Sender: TObject; var ItemIx, ItemHandle,
  160.       Button, Shift, X, Y: Integer);
  161.     procedure DrawArrows1Click(Sender: TObject);
  162.     procedure DrawColored1Click(Sender: TObject);
  163.     procedure DrawConnLabels1Click(Sender: TObject);
  164.     procedure DrawHandles1Click(Sender: TObject);
  165.     procedure DrawItemLabels1Click(Sender: TObject);
  166.     procedure None1Click(Sender: TObject);
  167.     procedure Items1Click(Sender: TObject);
  168.     procedure Handles1Click(Sender: TObject);
  169.     procedure Both1Click(Sender: TObject);
  170.     procedure N8Nodes1Click(Sender: TObject);
  171.     procedure N15Nodes1Click(Sender: TObject);
  172.     procedure N25Nodes1Click(Sender: TObject);
  173.     procedure N50Nodes1Click(Sender: TObject);
  174.     procedure N8Nodes2Click(Sender: TObject);
  175.     procedure N15Nodes2Click(Sender: TObject);
  176.     procedure N25Nodes2Click(Sender: TObject);
  177.     procedure N50Nodes2Click(Sender: TObject);
  178.     procedure RandomSizedNodes1Click(Sender: TObject);
  179.     procedure ITGraph1LineDblClick(Sender: TObject; var FromIx, ToIx,
  180.       Button, Shift, X, Y: Integer);
  181.     procedure ITGraph1KeyDown(Sender: TObject; var Key: Word;
  182.       Shift: TShiftState);
  183.     procedure Duplicate1Click(Sender: TObject);
  184.     procedure NoGraphic1Click(Sender: TObject);
  185.     procedure FullGraphic1Click(Sender: TObject);
  186.     procedure HalfGraphic1Click(Sender: TObject);
  187.     procedure IconGraphic1Click(Sender: TObject);
  188.     procedure FindDialog1Find(Sender: TObject);
  189.     procedure FindNode1Click(Sender: TObject);
  190.     procedure FindAgain1Click(Sender: TObject);
  191.     procedure PrintReport1Click(Sender: TObject);
  192.     procedure FitToScreen1Click(Sender: TObject);
  193.     procedure N251Click(Sender: TObject);
  194.     procedure N501Click(Sender: TObject);
  195.     procedure N751Click(Sender: TObject);
  196.     procedure N1001Click(Sender: TObject);
  197.     procedure N2001Click(Sender: TObject);
  198.     procedure N4001Click(Sender: TObject);
  199.     procedure FormShow(Sender: TObject);
  200.     procedure BringToFront1Click(Sender: TObject);
  201.     procedure SendToBack1Click(Sender: TObject);
  202.     procedure ITGraph1ItemDrag(Sender: TObject; var ItemIx, X0, Y0, X1, Y1,
  203.       Button, Shift: Integer);
  204.     procedure ShiftLeft1Click(Sender: TObject);
  205.     procedure ShiftRight1Click(Sender: TObject);
  206.   private
  207.     { Private declarations }
  208.     procedure RandomTree(NodeCount: Integer);
  209.     procedure RandomDirected(NodeCount: Integer);
  210.     procedure UpdateMenus;
  211.     procedure UpdateNodeMenu;
  212.     function AskToSave : Boolean;
  213.   public
  214.     { Public declarations }
  215.   end;
  216.  
  217. var
  218.   Playground: TPlayground;
  219.  
  220. implementation
  221.  
  222. {$R *.DFM}
  223.  
  224. function TPlayground.AskToSave : Boolean;
  225. var
  226.    wSave : Word;
  227. begin
  228.      AskToSave := True;
  229.  
  230.      if ITGraph1.IsDirty
  231.      then begin
  232.         if SaveDialog1.FileName = ''
  233.         then wSave := MessageDlg('Save changes made to the current graph?',
  234.              mtConfirmation, [mbYes, mbNo, mbCancel], 0)
  235.         else wSave := MessageDlg(
  236.              Concat('Save changes made to ''', SaveDialog1.FileName, '''?'),
  237.              mtConfirmation, [mbYes, mbNo, mbCancel], 0);
  238.         if wSave = mrCancel
  239.         then AskToSave := False
  240.         else if wSave = mrYes
  241.         then begin
  242.              if SaveDialog1.FileName <> ''
  243.              then ITGraph1.SaveAs := SaveDialog1.FileName
  244.              else if SaveDialog1.Execute
  245.              then ITGraph1.SaveAs := SaveDialog1.FileName
  246.              else AskToSave := False
  247.         end
  248.      end;
  249. end;
  250.  
  251. procedure TPlayground.New1Click(Sender: TObject);
  252. begin
  253.      if AskToSave
  254.      then begin
  255.           ITGraph1.Clear;
  256.           SaveDialog1.FileName := '';
  257.           UpdateNodeMenu
  258.      end
  259. end;
  260.  
  261. procedure TPlayground.Exit1Click(Sender: TObject);
  262. begin
  263.      if AskToSave
  264.      then Halt
  265. end;
  266.  
  267. procedure TPlayground.Open1Click(Sender: TObject);
  268. begin
  269.      if AskToSave
  270.         then begin
  271.         if OpenDialog1.Execute
  272.         then begin
  273.              ITGraph1.LoadFrom := OpenDialog1.FileName;
  274.              SaveDialog1.FileName := OpenDialog1.FileName;
  275.              ITGraph1.IsDirty := False;
  276.              UpdateMenus;
  277.              UpdateNodeMenu
  278.         end
  279.      end
  280. end;
  281.  
  282. procedure TPlayground.SaveAs1Click(Sender: TObject);
  283. begin
  284.      if SaveDialog1.Execute
  285.      then ITGraph1.SaveAs := SaveDialog1.FileName
  286. end;
  287.  
  288. procedure TPlayground.Save1Click(Sender: TObject);
  289. begin
  290.      if SaveDialog1.FileName <> ''
  291.      then ITGraph1.SaveAs := SaveDialog1.FileName
  292.      else if SaveDialog1.Execute
  293.           then ITGraph1.SaveAs := SaveDialog1.FileName
  294. end;
  295.  
  296. procedure TPlayground.FormResize(Sender: TObject);
  297. begin
  298.      ITGraph1.Left := 0;
  299.      ITGraph1.Top := 0;
  300.      ITGraph1.Width := Playground.ClientWidth;
  301.      ITGraph1.Height := Playground.ClientHeight
  302. end;
  303.  
  304. procedure TPlayground.UpdateNodeMenu;
  305. var
  306.    isSelected : Boolean;
  307. begin
  308.      isSelected := ITGraph1.SelectedIndex <> -1;
  309.  
  310.      if isSelected then
  311.         Playground.PopupMenu := PopupMenu1
  312.      else
  313.         Playground.PopupMenu := PopupMenu2;
  314.  
  315.      Remove1.Enabled := isSelected;
  316.      Duplicate1.Enabled := isSelected;
  317.      BringToFront1.Enabled := isSelected;
  318.      SendToBack1.Enabled := isSelected;
  319.  
  320.      if (ITGraph1.ArrangeMode = ITG_ModeTree)
  321.         and (ITGraph1.AutoArrange = ITG_AutoArrange) and isSelected then
  322.      begin
  323.           ShiftLeft1.Enabled := True;
  324.           ShiftRight1.Enabled := True
  325.      end
  326.      else
  327.      begin
  328.           ShiftLeft1.Enabled := False;
  329.           ShiftRight1.Enabled := False
  330.      end
  331. end;
  332.  
  333. procedure TPlayground.New2Click(Sender: TObject);
  334. begin
  335.      ITGraph1.AddItem('');
  336.      ITGraph1.SelectedIndex := ITGraph1.NewIndex;
  337.      UpdateNodeMenu
  338. end;
  339.  
  340. procedure TPlayground.AutoArrange1Click(Sender: TObject);
  341. begin
  342.      ITGraph1.ArrangeMode := ITG_AutoArrange
  343. end;
  344.  
  345. procedure TPlayground.ManualArrange1Click(Sender: TObject);
  346. begin
  347.      ITGraph1.ArrangeMode := ITG_ManualArrange
  348. end;
  349.  
  350. procedure TPlayground.ArrangeNow1Click(Sender: TObject);
  351. begin
  352.      ITGraph1.AutoArrange := ITG_ArrangeNow;
  353.      Manual1.Checked := True
  354. end;
  355.  
  356. procedure TPlayground.Automatic1Click(Sender: TObject);
  357. begin
  358.      ITGraph1.AutoArrange := ITG_AutoArrange;
  359.      Automatic1.Checked := True;
  360.      Manual1.Checked := False;
  361.      AutoArrange1.Caption := '&AutoArrange (Automatic)'
  362. end;
  363.  
  364. procedure TPlayground.Manual1Click(Sender: TObject);
  365. begin
  366.      ITGraph1.AutoArrange := ITG_ManualArrange;
  367.      Automatic1.Checked := False;
  368.      Manual1.Checked := True;
  369.      AutoArrange1.Caption := '&AutoArrange (Manual)'
  370. end;
  371.  
  372. procedure TPlayground.Now1Click(Sender: TObject);
  373. begin
  374.      ITGraph1.AutoArrange := ITG_ArrangeNow;
  375.      Automatic1.Checked := False;
  376.      Manual1.Checked := True;
  377.      AutoArrange1.Caption := '&AutoArrange (Manual)'
  378. end;
  379.  
  380. procedure TPlayground.Hierarchy1Click(Sender: TObject);
  381. begin
  382.      ITGraph1.ArrangeMode := ITG_ModeHierarchy;
  383.      UpdateMenus
  384. end;
  385.  
  386. procedure TPlayground.Compact1Click(Sender: TObject);
  387. begin
  388.      ITGraph1.ArrangeMode := ITG_ModeCompact;
  389.      UpdateMenus
  390. end;
  391.  
  392. procedure TPlayground.FlowChart1Click(Sender: TObject);
  393. begin
  394.      ITGraph1.ArrangeMode := ITG_ModeFlowChart;
  395.      UpdateMenus
  396. end;
  397.  
  398. procedure TPlayground.Tree1Click(Sender: TObject);
  399. begin
  400.      ITGraph1.ArrangeMode := ITG_ModeTree;
  401.      UpdateMenus
  402. end;
  403.  
  404. procedure TPlayground.RightToLeft1Click(Sender: TObject);
  405. begin
  406.      ITGraph1.DrawDir := ITG_RightToLeft;
  407.      UpdateMenus
  408. end;
  409.  
  410. procedure TPlayground.LeftToRight1Click(Sender: TObject);
  411. begin
  412.      ITGraph1.DrawDir := ITG_LeftToRight;
  413.      UpdateMenus
  414. end;
  415.  
  416. procedure TPlayground.BottomToTop1Click(Sender: TObject);
  417. begin
  418.      ITGraph1.DrawDir := ITG_BottomToTop;
  419.      UpdateMenus
  420. end;
  421.  
  422. procedure TPlayground.TopToBottom1Click(Sender: TObject);
  423. begin
  424.      ITGraph1.DrawDir := ITG_TopToBottom;
  425.      UpdateMenus
  426. end;
  427.  
  428. procedure TPlayground.ITGraph1Click(Sender: TObject; var Button, Shift, X,
  429.   Y: Integer);
  430. begin
  431.      ITGraph1.SelectedIndex := -1;
  432.      UpdateNodeMenu
  433. end;
  434.  
  435. procedure TPlayground.ITGraph1ItemClick(Sender: TObject; var ItemIx,
  436.   ItemHandle, Button, Shift, X, Y: Integer);
  437. begin
  438.      if ItemHandle = 0 then
  439.         if Button = ITG_LeftButton then
  440.         begin
  441.            ITGraph1.SelectedIndex := ItemIx;
  442.            UpdateNodeMenu
  443.         end
  444. end;
  445.  
  446. procedure TPlayground.ITGraph1KeyPress(Sender: TObject; var Key: Char);
  447. var
  448.    selIx : Integer;
  449.    selList : String;
  450. begin
  451.     selIx := ITGraph1.SelectedIndex;
  452.     if selIx <> -1 then
  453.     begin
  454.          selList := ITGraph1.List(.selIx.);
  455.          if Ord(Key) = 8 then
  456.             if selList[Length(selList)] = Char(10) then
  457.                 Delete(selList, Length(selList)-1, 2)
  458.             else
  459.                 Delete(selList, Length(selList), 1)
  460.          else if Ord(Key) = 13 then
  461.               selList := Concat(selList, Char(13), Char(10))
  462.          else
  463.              selList := Concat(selList, Key);
  464.          ITGraph1.List(.selIx.) := selList
  465.     end
  466. end;
  467. procedure TPlayground.Remove1Click(Sender: TObject);
  468. var
  469.    oldSelIx : Integer;
  470. begin
  471.      oldSelIx := ITGraph1.SelectedIndex;
  472.      ITGraph1.RemoveItem(ITGraph1.SelectedIndex);
  473.      if oldSelIx > 0 then
  474.         ITGraph1.SelectedIndex := oldSelIx - 1;
  475.      UpdateNodeMenu
  476. end;
  477.  
  478. procedure TPlayground.ITGraph1ItemConnect(Sender: TObject; var FromIx,
  479.   FromHandle, ToIx, ToHandle, Button, Shift: Integer);
  480. begin
  481.      if (Shift and ITG_AltDown) <> 0 then
  482.      begin
  483.           ITGraph1.QueryItem := ToIx;
  484.           ITGraph1.QueryState := ITG_QueryGetSources;
  485.           if ITGraph1.QueryState <> 0 then
  486.              ITGraph1.RemoveFrom(.ITGraph1.ConnectFromIndex.) := ToIx
  487.      end;
  488.  
  489.      ITGraph1.ConnectTo(.FromIx.) := ToIx;
  490.      if FromHandle <> 0 then
  491.         begin
  492.                ITGraph1.ConnectFromHandle := FromHandle;
  493.                ITGraph1.ConnectToHandle := ToHandle
  494.         end
  495.      else
  496.          begin
  497.               ITGraph1.ConnectFromHandle := 3;
  498.               ITGraph1.ConnectToHandle := 1
  499.          end
  500. end;
  501.  
  502. procedure TPlayground.Print1Click(Sender: TObject);
  503. begin
  504.      if PrintDialog1.Execute then
  505.         begin
  506.              ITGraph1.PrintHeader := '&2ITGraph Property Playground&5Page &p of &n';
  507.              Printer.BeginDoc;
  508.              ITGraph1.PrintGraph := Printer.Handle;
  509.              Printer.EndDoc;
  510.         end
  511. end;
  512.  
  513. procedure TPlayground.FillColor1Click(Sender: TObject);
  514. begin
  515.      ColorDialog1.Color := ITGraph1.ItemFillColor(.ITGraph1.SelectedIndex.);
  516.      if ColorDialog1.Execute then
  517.         ITGraph1.ItemFillColor(.ITGraph1.SelectedIndex.) := ColorDialog1.Color
  518. end;
  519.  
  520. procedure TPlayground.TextColor1Click(Sender: TObject);
  521. begin
  522.      ColorDialog1.Color := ITGraph1.ItemTextColor(.ITGraph1.SelectedIndex.);
  523.      if ColorDialog1.Execute then
  524.         ITGraph1.ItemTextColor(.ITGraph1.SelectedIndex.) := ColorDialog1.Color
  525. end;
  526.  
  527. procedure TPlayground.BorderColor1Click(Sender: TObject);
  528. begin
  529.      ColorDialog1.Color := ITGraph1.ItemBorderColor(.ITGraph1.SelectedIndex.);
  530.      if ColorDialog1.Execute then
  531.         ITGraph1.ItemBorderColor(.ITGraph1.SelectedIndex.) := ColorDialog1.Color
  532. end;
  533.  
  534. procedure TPlayground.ForeColor1Click(Sender: TObject);
  535. begin
  536.      ColorDialog1.Color := ITGraph1.ForeColor;
  537.      if ColorDialog1.Execute then
  538.         ITGraph1.ForeColor := ColorDialog1.Color
  539. end;
  540.  
  541. procedure TPlayground.BackColor1Click(Sender: TObject);
  542. begin
  543.      ColorDialog1.Color := ITGraph1.BackColor;
  544.      if ColorDialog1.Execute then
  545.         ITGraph1.BackColor := ColorDialog1.Color
  546. end;
  547.  
  548. procedure TPlayground.DefFillColor1Click(Sender: TObject);
  549. begin
  550.      ColorDialog1.Color := ITGraph1.FillColor;
  551.      if ColorDialog1.Execute then
  552.         ITGraph1.FillColor := ColorDialog1.Color
  553. end;
  554.  
  555. procedure TPlayground.Font1Click(Sender: TObject);
  556. begin
  557.      FontDialog1.Font := ITGraph1.Font;
  558.      if FontDialog1.Execute then
  559.      begin
  560.         ITGraph1.Font := FontDialog1.Font;
  561.         {we have to explicitly set the IsDirty flag in Delphi
  562.         because Delphi's Font property is differnt than Visual
  563.         Basic's font properties}
  564.         ITGraph1.IsDirty := True
  565.      end
  566. end;
  567.  
  568. procedure TPlayground.ITGraph1SelectRect(Sender: TObject; var L, T, W, H,
  569.   Button, Shift: Integer);
  570. begin
  571.      ITGraph1.ZoomSelectRect := True
  572. end;
  573.  
  574. procedure TPlayground.ITGraph1DblClick(Sender: TObject; var Button, Shift,
  575.   X, Y: Integer);
  576. begin
  577.      ITGraph1.DrawScale := 0
  578. end;
  579.  
  580. procedure TPlayground.PrintSetup1Click(Sender: TObject);
  581. begin
  582.      PrinterSetupDialog1.Execute
  583. end;
  584.  
  585. procedure TPlayground.ItemShape1Click(Sender: TObject);
  586. var
  587.    newShape : Integer;
  588. begin
  589.      ITGraph1.ShapeSelect := ITGraph1.ItemShape(.ITGraph1.SelectedIndex.);
  590.      newShape := ITGraph1.ShapeSelect;
  591.      if newShape <> -1 then
  592.         ITGraph1.ItemShape(.ITGraph1.SelectedIndex.) := newShape
  593. end;
  594.  
  595. procedure TPlayground.ItemGraphic1Click(Sender: TObject);
  596. var
  597.    newGraphic : Integer;
  598. begin
  599.      ITGraph1.GraphicSelect := ITGraph1.ItemGraphic(.ITGraph1.SelectedIndex.);
  600.      newGraphic := ITGraph1.GraphicSelect;
  601.      if newGraphic <> -1 then
  602.      begin
  603.           ITGraph1.ItemGraphic(.ITGraph1.SelectedIndex.) := newGraphic;
  604.           ITGraph1.ItemGraphicStyle(.ITGraph1.SelectedIndex.) := ITG_GraphicShapeFill
  605.      end
  606. end;
  607.  
  608. procedure TPlayground.ITGraph1ItemDblClick(Sender: TObject; var ItemIx,
  609.   ItemHandle, Button, Shift, X, Y: Integer);
  610. begin
  611.      NodeInfoDlg.itgTheGraph := @ITGraph1;
  612.      NodeInfoDlg.ShowModal
  613. end;
  614.  
  615. procedure TPlayground.DrawArrows1Click(Sender: TObject);
  616. begin
  617.      ITGraph1.DrawArrows := not ITGraph1.DrawArrows;
  618.      DrawArrows1.Checked := ITGraph1.DrawArrows
  619. end;
  620.  
  621. procedure TPlayground.DrawColored1Click(Sender: TObject);
  622. begin
  623.      ITGraph1.DrawColored := not ITGraph1.DrawColored;
  624.      DrawColored1.Checked := ITGraph1.DrawColored
  625. end;
  626.  
  627. procedure TPlayground.DrawConnLabels1Click(Sender: TObject);
  628. begin
  629.      ITGraph1.DrawConnLabels := not ITGraph1.DrawConnLabels;
  630.      DrawConnLabels1.Checked := ITGraph1.DrawConnLabels
  631. end;
  632.  
  633. procedure TPlayground.DrawHandles1Click(Sender: TObject);
  634. begin
  635.      ITGraph1.DrawHandles := not ITGraph1.DrawHandles;
  636.      DrawHandles1.Checked := ITGraph1.DrawHandles
  637. end;
  638.  
  639. procedure TPlayground.DrawItemLabels1Click(Sender: TObject);
  640. begin
  641.      ITGraph1.DrawItemLabels := not ITGraph1.DrawItemLabels;
  642.      DrawItemLabels1.Checked := ITGraph1.DrawItemLabels
  643. end;
  644.  
  645. procedure TPlayground.None1Click(Sender: TObject);
  646. begin
  647.      ITGraph1.RubberBand := ITG_RBNone;
  648.      None1.Checked := True;
  649.      Items1.Checked := False;
  650.      Handles1.Checked := False;
  651.      Both1.Checked := False;
  652.      RubberBand1.Caption := '&Rubber Band (None)'
  653. end;
  654.  
  655. procedure TPlayground.Items1Click(Sender: TObject);
  656. begin
  657.      ITGraph1.RubberBand := ITG_RBItems;
  658.      None1.Checked := False;
  659.      Items1.Checked := True;
  660.      Handles1.Checked := False;
  661.      Both1.Checked := False;
  662.      RubberBand1.Caption := '&Rubber Band (Items)'
  663. end;
  664.  
  665. procedure TPlayground.Handles1Click(Sender: TObject);
  666. begin
  667.      ITGraph1.RubberBand := ITG_RBHandles;
  668.      None1.Checked := False;
  669.      Items1.Checked := False;
  670.      Handles1.Checked := True;
  671.      Both1.Checked := False;
  672.      RubberBand1.Caption := '&Rubber Band (Handles)'
  673. end;
  674.  
  675. procedure TPlayground.Both1Click(Sender: TObject);
  676. begin
  677.      ITGraph1.RubberBand := ITG_RBBoth;
  678.      None1.Checked := False;
  679.      Items1.Checked := False;
  680.      Handles1.Checked := False;
  681.      Both1.Checked := True;
  682.      RubberBand1.Caption := '&Rubber Band (Both)'
  683. end;
  684.  
  685. procedure TPlayground.RandomTree(NodeCount : Integer);
  686. var
  687.    i, j : Integer;
  688.    oldRedraw : Boolean;
  689. begin
  690.      if AskToSave
  691.      then begin
  692.         oldRedraw := ITGraph1.Redraw;
  693.         ITGraph1.Redraw := False;
  694.         ITGraph1.Clear;
  695.         Randomize;
  696.         for i := 1 to NodeCount do
  697.         begin
  698.              ITGraph1.AddItem(Concat('Node #', IntToStr(i)));
  699.              if RandomSizedNodes1.Checked then
  700.              begin
  701.                   ITGraph1.ItemWidth(.i-1.) := Random(200) + 25;
  702.                   ITGraph1.ItemHeight(.i-1.) := Random(200) + 25;
  703.              end;
  704.              if i > 1 then
  705.              begin
  706.                   j := Random(i-1);
  707.                   ITGraph1.ConnectTo(.j.) := i-1;
  708.              end;
  709.         end;
  710.         ITGraph1.Redraw := oldRedraw
  711.      end
  712. end;
  713.  
  714. procedure TPlayground.RandomDirected(NodeCount : Integer);
  715. var
  716.    i, j, k : Integer;
  717.    oldRedraw : Boolean;
  718. begin
  719.      if AskToSave
  720.      then begin
  721.         oldRedraw := ITGraph1.Redraw;
  722.         ITGraph1.Redraw := False;
  723.         ITGraph1.Clear;
  724.         Randomize;
  725.         for i := 1 to NodeCount do
  726.         begin
  727.              ITGraph1.AddItem(Concat('Node #', IntToStr(i)));
  728.              if RandomSizedNodes1.Checked then
  729.              begin
  730.                   ITGraph1.ItemWidth(.i-1.) := Random(200) + 25;
  731.                   ITGraph1.ItemHeight(.i-1.) := Random(200) + 25;
  732.              end;
  733.              if i > 1 then
  734.                 for j := 0 to Random(3) do
  735.                 begin
  736.                      k := Random(i-1);
  737.                      ITGraph1.ConnectTo(.k.) := i-1;
  738.                 end;
  739.         end;
  740.         ITGraph1.Redraw := oldRedraw
  741.      end
  742. end;
  743.  
  744. procedure TPlayground.N8Nodes1Click(Sender: TObject);
  745. begin
  746.      RandomTree(8)
  747. end;
  748.  
  749. procedure TPlayground.N15Nodes1Click(Sender: TObject);
  750. begin
  751.      RandomTree(15)
  752. end;
  753.  
  754. procedure TPlayground.N25Nodes1Click(Sender: TObject);
  755. begin
  756.      RandomTree(25)
  757. end;
  758.  
  759. procedure TPlayground.N50Nodes1Click(Sender: TObject);
  760. begin
  761.      RandomTree(50)
  762. end;
  763.  
  764. procedure TPlayground.N8Nodes2Click(Sender: TObject);
  765. begin
  766.      RandomDirected(8)
  767. end;
  768.  
  769. procedure TPlayground.N15Nodes2Click(Sender: TObject);
  770. begin
  771.      RandomDirected(15)
  772. end;
  773.  
  774. procedure TPlayground.N25Nodes2Click(Sender: TObject);
  775. begin
  776.      RandomDirected(25)
  777. end;
  778.  
  779. procedure TPlayground.N50Nodes2Click(Sender: TObject);
  780. begin
  781.      RandomDirected(50)
  782. end;
  783.  
  784. procedure TPlayground.RandomSizedNodes1Click(Sender: TObject);
  785. begin
  786.      RandomSizedNodes1.Checked := not RandomSizedNodes1.Checked
  787. end;
  788.  
  789. procedure TPlayground.ITGraph1LineDblClick(Sender: TObject; var FromIx,
  790.   ToIx, Button, Shift, X, Y: Integer);
  791. begin
  792.      ITGraph1.ConnectTo(.FromIx.) := ToIx;
  793.      ConnInfoDlg.itgTheGraph := @ITGraph1;
  794.      ConnInfoDlg.ShowModal
  795. end;
  796.  
  797. procedure TPlayground.ITGraph1KeyDown(Sender: TObject; var Key: Word;
  798.   Shift: TShiftState);
  799. begin
  800.      if (Key = VK_DELETE) and (ITGraph1.SelectedIndex >= 0) then
  801.         Playground.Remove1Click(Sender)
  802.      else if Key = VK_INSERT then
  803.           Playground.New2Click(Sender)
  804.      else if Key = VK_TAB then
  805.           ITGraph1.SelectedIndex := ITGraph1.SelectedIndex + 1
  806.      else if (Key = VK_HOME) and BringToFront1.Enabled then
  807.           Playground.BringToFront1Click(Sender)
  808.      else if (Key = VK_END) and SendToBack1.Enabled then
  809.           Playground.SendToBack1Click(Sender)
  810.      else if (Key = VK_PRIOR) and ShiftLeft1.Enabled then
  811.           Playground.ShiftLeft1Click(Sender)
  812.      else if (Key = VK_NEXT) and ShiftRight1.Enabled then
  813.           Playground.ShiftRight1Click(Sender)
  814. end;
  815.  
  816. procedure TPlayground.Duplicate1Click(Sender: TObject);
  817. var
  818.    selIx, newIx : Integer;
  819. begin
  820.      selIx := ITGraph1.SelectedIndex;
  821.      ITGraph1.AddItem(ITGraph1.List(.selIx.));
  822.      newIx := ITGraph1.NewIndex;
  823.  
  824.      ITGraph1.ItemXpos(.newIx.) := ITGraph1.ItemXpos(.selIx.) + 10;
  825.      ITGraph1.ItemYpos(.newIx.) := ITGraph1.ItemYpos(.selIx.) + 10;
  826.      ITGraph1.ItemWidth(.newIx.) := ITGraph1.ItemWidth(.selIx.);
  827.      ITGraph1.ItemHeight(.newIx.) := ITGraph1.ItemHeight(.selIx.);
  828.      ITGraph1.ItemBorderColor(.newIx.) := ITGraph1.ItemBorderColor(.selIx.);
  829.      ITGraph1.ItemFillColor(.newIx.) := ITGraph1.ItemFillColor(.selIx.);
  830.      ITGraph1.ItemTextColor(.newIx.) := ITGraph1.ItemTextColor(.selIx.);
  831.      ITGraph1.ItemShape(.newIx.) := ITGraph1.ItemShape(.selIx.);
  832.      ITGraph1.ItemGraphic(.newIx.) := ITGraph1.ItemGraphic(.selIx.);
  833.      ITGraph1.ItemGraphicStyle(.newIx.) := ITGraph1.ItemGraphicStyle(.selIx.);
  834.  
  835.      ITGraph1.SelectedIndex := 0;
  836. end;
  837.  
  838. procedure TPlayground.UpdateMenus;
  839. begin
  840.      case ITGraph1.ArrangeMode of
  841.           ITG_ModeHierarchy: begin
  842.                Hierarchy1.Checked := True;
  843.                Compact1.Checked := False;
  844.                FlowChart1.Checked := False;
  845.                Tree1.Checked := False;
  846.                ArrangeMode1.Caption := 'Arrange&Mode (Hierarchy)'
  847.                end;
  848.           ITG_ModeCompact: begin
  849.                Hierarchy1.Checked := False;
  850.                Compact1.Checked := True;
  851.                FlowChart1.Checked := False;
  852.                Tree1.Checked := False;
  853.                ArrangeMode1.Caption := 'Arrange&Mode (Compact)'
  854.                end;
  855.           ITG_ModeFlowChart: begin
  856.                Hierarchy1.Checked := False;
  857.                Compact1.Checked := False;
  858.                FlowChart1.Checked := True;
  859.                Tree1.Checked := False;
  860.                ArrangeMode1.Caption := 'Arrange&Mode (FlowChart)'
  861.                end;
  862.           ITG_ModeTree: begin
  863.                Hierarchy1.Checked := False;
  864.                Compact1.Checked := False;
  865.                FlowChart1.Checked := False;
  866.                Tree1.Checked := True;
  867.                ArrangeMode1.Caption := 'Arrange&Mode (Tree)'
  868.                end;
  869.      end;
  870.  
  871.      case ITGraph1.DrawDir of
  872.           ITG_RightToLeft: begin
  873.                RightToLeft1.Checked := True;
  874.                LeftToRight1.Checked := False;
  875.                BottomToTop1.Checked := False;
  876.                TopToBottom1.Checked := False;
  877.                DrawDir1.Caption := '&DrawDir (RightToLeft)'
  878.                end;
  879.           ITG_LeftToRight: begin
  880.                RightToLeft1.Checked := False;
  881.                LeftToRight1.Checked := True;
  882.                BottomToTop1.Checked := False;
  883.                TopToBottom1.Checked := False;
  884.                DrawDir1.Caption := '&DrawDir (LeftToRight)'
  885.                end;
  886.           ITG_BottomToTop: begin
  887.                RightToLeft1.Checked := False;
  888.                LeftToRight1.Checked := False;
  889.                BottomToTop1.Checked := True;
  890.                TopToBottom1.Checked := False;
  891.                DrawDir1.Caption := '&DrawDir (BottomToTop)'
  892.                end;
  893.           ITG_TopToBottom: begin
  894.                RightToLeft1.Checked := False;
  895.                LeftToRight1.Checked := False;
  896.                BottomToTop1.Checked := False;
  897.                TopToBottom1.Checked := True;
  898.                DrawDir1.Caption := '&DrawDir (TopToBottom)'
  899.                end;
  900.      end;
  901.  
  902.      DrawArrows1.Checked := ITGraph1.DrawArrows;
  903.      DrawColored1.Checked := ITGraph1.DrawColored;
  904.      DrawConnLabels1.Checked := ITGraph1.DrawConnLabels;
  905.      DrawHandles1.Checked := ITGraph1.DrawHandles;
  906.      DrawItemLabels1.Checked := ITGraph1.DrawItemLabels;
  907.  
  908.      if ITGraph1.DrawScale = 0 then
  909.         DrawScale1.Caption := 'Draw&Scale (Fit to Screen)'
  910.      else
  911.          DrawScale1.Caption := Concat('Draw&Scale (',
  912.               IntToStr(ITGraph1.DrawScale), '%)');
  913.  
  914.      UpdateNodeMenu
  915. end;
  916.  
  917. procedure TPlayground.NoGraphic1Click(Sender: TObject);
  918. var
  919.    selIx : Integer;
  920. begin
  921.      selIx := ITGraph1.SelectedIndex;
  922.      ITGraph1.ItemGraphicStyle(.selIx.) := ITG_GraphicNone;
  923.      ITGraph1.ItemLabelLeft(.selIx.) := 0;
  924.      ITGraph1.ItemLabelWidth(.selIx.) := 0; { until right edge }
  925.      ITGraph1.ItemLabelTop(.selIx.) := 0;
  926.      ITGraph1.ItemLabelHeight(.selIx.) := 0; { until bottom }
  927.      ITGraph1.ItemLabelAlign(.selIx.) := ITG_AlignMiddleCenter;
  928. end;
  929.  
  930. procedure TPlayground.FullGraphic1Click(Sender: TObject);
  931. var
  932.    selIx : Integer;
  933. begin
  934.      selIx := ITGraph1.SelectedIndex;
  935.      ITGraph1.ItemGraphicStyle(.selIx.) := ITG_GraphicShapeFill;
  936.      ITGraph1.ItemLabelLeft(.selIx.) := 0;
  937.      ITGraph1.ItemLabelWidth(.selIx.) := 0; { until right edge }
  938.      ITGraph1.ItemLabelTop(.selIx.) := 0;
  939.      ITGraph1.ItemLabelHeight(.selIx.) := 0; { until bottom }
  940.      ITGraph1.ItemLabelAlign(.selIx.) := ITG_AlignMiddleCenter;
  941. end;
  942.  
  943. procedure TPlayground.HalfGraphic1Click(Sender: TObject);
  944. var
  945.    selIx : Integer;
  946. begin
  947.      selIx := ITGraph1.SelectedIndex;
  948.      ITGraph1.ItemGraphicStyle(.selIx.) := ITG_GraphicIconFill;
  949.      ITGraph1.ItemGraphicLeft(.selIx.) := 0;
  950.      ITGraph1.ItemGraphicWidth(.selIx.) := ITGraph1.ItemWidth(.selIx.) div 2;
  951.      ITGraph1.ItemGraphicTop(.selIx.) := 0;
  952.      ITGraph1.ItemGraphicHeight(.selIx.) := ITGraph1.ItemHeight(.selIx.);
  953.  
  954.      ITGraph1.ItemLabelLeft(.selIx.) := ITGraph1.ItemWidth(.selIx.) div 2 + 2;
  955.      ITGraph1.ItemLabelWidth(.selIx.) := 0; { until right edge }
  956.      ITGraph1.ItemLabelTop(.selIx.) := 0;
  957.      ITGraph1.ItemLabelHeight(.selIx.) := 0; { until bottom }
  958.      ITGraph1.ItemLabelAlign(.selIx.) := ITG_AlignMiddleLeft;
  959. end;
  960.  
  961. procedure TPlayground.IconGraphic1Click(Sender: TObject);
  962. var
  963.    selIx : Integer;
  964. begin
  965.      selIx := ITGraph1.SelectedIndex;
  966.      ITGraph1.ItemGraphicStyle(.selIx.) := ITG_GraphicIconFillIso;
  967.      ITGraph1.ItemGraphicLeft(.selIx.) := 5;
  968.      ITGraph1.ItemGraphicWidth(.selIx.) := 32;
  969.      ITGraph1.ItemGraphicTop(.selIx.) := 5;
  970.      ITGraph1.ItemGraphicHeight(.selIx.) := 32;
  971.  
  972.      ITGraph1.ItemLabelLeft(.selIx.) := 40;
  973.      ITGraph1.ItemLabelWidth(.selIx.) := 0; { until right edge }
  974.      ITGraph1.ItemLabelTop(.selIx.) := 0;
  975.      ITGraph1.ItemLabelHeight(.selIx.) := 0; { until bottom }
  976.      ITGraph1.ItemLabelAlign(.selIx.) := ITG_AlignMiddleLeft;
  977. end;
  978.  
  979. procedure TPlayground.FindDialog1Find(Sender: TObject);
  980. var
  981.    i, ix : Integer;
  982. begin
  983.      FindAgain1.Enabled := True;
  984.      for i := 1 to ITGraph1.ListCount - 1 do
  985.      begin
  986.           ix := (ITGraph1.SelectedIndex + i) mod ITGraph1.ListCount;
  987.           if Pos(FindDialog1.FindText, ITGraph1.List(.ix.)) > 0 then
  988.           begin
  989.               ITGraph1.SelectRectLeft := ITGraph1.ItemXpos(.ix.);
  990.               ITGraph1.SelectRectTop := ITGraph1.ItemYpos(.ix.);
  991.               ITGraph1.SelectRectWidth := ITGraph1.ItemWidth(.ix.);
  992.               ITGraph1.SelectRectHeight := ITGraph1.ItemHeight(.ix.);
  993.               ITGraph1.ZoomSelectRect := False; { scroll w/o scale change }
  994.               ITGraph1.SelectedIndex := ix;
  995.               FindDialog1.CloseDialog;
  996.               Exit;
  997.          end;
  998.      end;
  999.  
  1000.      MessageDlg('Search string ''' + FindDialog1.FindText + ''' not found',
  1001.           mtInformation, [mbOk], 0);
  1002.      FindDialog1.CloseDialog
  1003. end;
  1004.  
  1005. procedure TPlayground.FindNode1Click(Sender: TObject);
  1006. begin
  1007.      FindDialog1.Position := Point(Playground.Left + 50, Playground.Top + 50);
  1008.      FindDialog1.Execute
  1009. end;
  1010.  
  1011. procedure TPlayground.FindAgain1Click(Sender: TObject);
  1012. begin
  1013.      Playground.FindDialog1Find(FindDialog1)
  1014. end;
  1015.  
  1016. procedure TPlayground.PrintReport1Click(Sender: TObject);
  1017. var
  1018.    pos : TPoint;
  1019.    rcGraph : TRect;                                        
  1020.    charHeight, charWidth, i : Integer;
  1021. begin
  1022.      Printer.BeginDoc;
  1023.  
  1024.      {compute width and height of largest character, 'M'}
  1025.      charWidth := Printer.Canvas.TextWidth('M');
  1026.      charHeight := Printer.Canvas.TextHeight('M');
  1027.  
  1028.      {compute output position, initially indent by two lines and four chars}
  1029.      pos := Point(4 * charWidth, 2 * charHeight);
  1030.  
  1031.      {print heading information}
  1032.      Printer.Canvas.TextOut(pos.x, pos.y, 'ITGraph Property Playground');
  1033.      pos.y := pos.y + charHeight; {go to next line}
  1034.      Printer.Canvas.TextOut(pos.x, pos.y, 'Current Graph and Associated Statistics');
  1035.      pos.y := pos.y + 2 * charHeight; {skip a line}
  1036.  
  1037.      {compute bounding rectangle for graph, 1/3 of page width, 1/5 of page ht}
  1038.      rcGraph := Rect(pos.x, pos.y, pos.x + Printer.PageWidth div 3,
  1039.              pos.y + Printer.PageHeight div 5);
  1040.      {draw rectangle around graph}
  1041.      Printer.Canvas.Rectangle(rcGraph.Left, rcGraph.Top,
  1042.           rcGraph.Right, rcGraph.Bottom);
  1043.  
  1044.      ITGraph1.PrintToDC := 0; {select entire graph}
  1045.      {select the target print area}
  1046.      ITGraph1.PrintRectLeft := rcGraph.Left;
  1047.      ITGraph1.PrintRectTop := rcGraph.Top;
  1048.      ITGraph1.PrintRectWidth := rcGraph.Right - rcGraph.Left;
  1049.      ITGraph1.PrintRectHeight := rcGraph.Bottom - rcGraph.Top;
  1050.      ITGraph1.PrintToDC := Printer.Handle; {print the graph}
  1051.  
  1052.      pos.y := pos.y + ITGraph1.PrintRectHeight;
  1053.      pos.y := pos.y + charHeight;
  1054.  
  1055.      {print the names of all nodes in the graph}
  1056.      Printer.Canvas.TextOut(pos.x, pos.y, Concat('The Graph Contains ',
  1057.           IntToStr(ITGraph1.ListCount), ' Nodes'));
  1058.      pos.y := pos.y + charHeight;
  1059.      pos.x := pos.x + 2 * charWidth; {indent the node list}
  1060.      for i := 0 to ITGraph1.ListCount - 1 do
  1061.      begin
  1062.           Printer.Canvas.TextOut(pos.x, pos.y, Concat('  Node ',
  1063.                IntToStr(i), ': ', ITGraph1.List(.i.)));
  1064.           pos.y := pos.y + charHeight;
  1065.      end;
  1066.  
  1067.      Printer.EndDoc;
  1068. end;
  1069.  
  1070. procedure TPlayground.FitToScreen1Click(Sender: TObject);
  1071. begin
  1072.      ITGraph1.DrawScale := 0;
  1073.      UpdateMenus
  1074. end;
  1075.  
  1076. procedure TPlayground.N251Click(Sender: TObject);
  1077. begin
  1078.      ITGraph1.DrawScale := 25;
  1079.      UpdateMenus
  1080. end;
  1081.  
  1082. procedure TPlayground.N501Click(Sender: TObject);
  1083. begin
  1084.      ITGraph1.DrawScale := 50;
  1085.      UpdateMenus
  1086. end;
  1087.  
  1088. procedure TPlayground.N751Click(Sender: TObject);
  1089. begin
  1090.      ITGraph1.DrawScale := 75;
  1091.      UpdateMenus
  1092. end;
  1093.  
  1094. procedure TPlayground.N1001Click(Sender: TObject);
  1095. begin
  1096.      ITGraph1.DrawScale := 100;
  1097.      UpdateMenus
  1098. end;
  1099.  
  1100. procedure TPlayground.N2001Click(Sender: TObject);
  1101. begin
  1102.      ITGraph1.DrawScale := 200;
  1103.      UpdateMenus
  1104. end;
  1105.  
  1106. procedure TPlayground.N4001Click(Sender: TObject);
  1107. begin
  1108.      ITGraph1.DrawScale := 400;
  1109.      UpdateMenus
  1110. end;
  1111.  
  1112. procedure TPlayground.FormShow(Sender: TObject);
  1113. begin
  1114.      ITGraph1.Clear
  1115. end;
  1116.  
  1117. procedure TPlayground.BringToFront1Click(Sender: TObject);
  1118. begin
  1119.      ITGraph1.ItemIndex(.ITGraph1.SelectedIndex.) := ITGraph1.ListCount - 1
  1120. end;
  1121.  
  1122. procedure TPlayground.SendToBack1Click(Sender: TObject);
  1123. begin
  1124.      ITGraph1.ItemIndex(.ITGraph1.SelectedIndex.) := 0
  1125. end;
  1126.  
  1127. procedure TPlayground.ITGraph1ItemDrag(Sender: TObject; var ItemIx, X0, Y0,
  1128.   X1, Y1, Button, Shift: Integer);
  1129. begin
  1130.      ITGraph1.SelectedIndex := ItemIx
  1131. end;
  1132.  
  1133. procedure TPlayground.ShiftLeft1Click(Sender: TObject);
  1134. var
  1135.    selIx, parIx, sibIx : Integer;
  1136. begin
  1137.      selIx := ITGraph1.SelectedIndex;
  1138.      ITGraph1.QueryItem := selIx;
  1139.      ITGraph1.QueryState := ITG_QueryGetSources;
  1140.      if ITGraph1.QueryState <> 0 then
  1141.      begin
  1142.           parIx := ITGraph1.ConnectFromIndex;
  1143.           ITGraph1.QueryItem := parIx;
  1144.           ITGraph1.QueryState := ITG_QueryGetTargets;
  1145.           sibIx := -1;
  1146.           while (ITGraph1.QueryState <> 0) and (ITGraph1.ConnectToIndex <> selIx) do
  1147.           begin
  1148.                sibIx := ITGraph1.ConnectToIndex;
  1149.                ITGraph1.QueryState := ITG_QueryIterate
  1150.           end;
  1151.           if sibIx >= 0 then
  1152.           begin
  1153.              ITGraph1.ItemIndex(.selIx.) := sibIx;
  1154.              ITGraph1.AutoArrange := ITG_AutoArrange
  1155.           end
  1156.      end
  1157. end;
  1158.  
  1159. procedure TPlayground.ShiftRight1Click(Sender: TObject);
  1160. var
  1161.    selIx, parIx, sibIx : Integer;
  1162. begin
  1163.      selIx := ITGraph1.SelectedIndex;
  1164.      ITGraph1.QueryItem := selIx;
  1165.      ITGraph1.QueryState := ITG_QueryGetSources;
  1166.      if ITGraph1.QueryState <> 0 then
  1167.      begin
  1168.           parIx := ITGraph1.ConnectFromIndex;
  1169.           ITGraph1.QueryItem := parIx;
  1170.           ITGraph1.QueryState := ITG_QueryGetTargets;
  1171.           sibIx := -1;
  1172.           while (ITGraph1.QueryState <> 0) and (sibIx <= selIx) do
  1173.           begin
  1174.                sibIx := ITGraph1.ConnectToIndex;
  1175.                ITGraph1.QueryState := ITG_QueryIterate
  1176.           end;
  1177.           if sibIx > selIx then
  1178.           begin
  1179.              ITGraph1.ItemIndex(.selIx.) := sibIx;
  1180.              ITGraph1.AutoArrange := ITG_AutoArrange
  1181.           end
  1182.      end
  1183. end;
  1184.  
  1185. end.
  1186.